1 Introducción
En este tercer taller del curso revisaremos las funciones básicas del paquete Dplyr de Tidyverse para manejo y preprocesamiento de datos con R.
1.1 Hoja de referencia (cheatsheet) de Dplyr
2 Repasemos las funciones más importantes de Dplyr
Función que utilizamos para…
… elegir una o más filas específicas:
… cambiarle el nombre a una variable (columna):
… crear una variable:
… elegir una o más columnas específicas:
… resumir los datos calculando estadísticas (media, suma, min, max, etc):
… agrupar filas de un dataframe según una o más variables:
… ordenar filas de un dataframe según una o más variables:
… ordenar o cambiar de posición una o más columnas:
3 Recordar
La sintaxis general de las funciones en R sigue esta lógica: nombre_de_la_función( data, argumento(s) ).
Omitir mayúsculas, tildes, espacios o cualquier caracter especial.
4 Ahora te presentamos a los “pingüinos de Palmer”
Palmerpenguins es una base de datos elaborado y publicado por la Dra. Kristen Gorman y sus colegas del sitio de Investigación Ecológica a Largo Plazo de la Estación Palmer (Palmer LTER) en la Antártida. Estos datos se publicaron originalmente en PLoS ONE. Puedes obtener más información sobre este paquete aquí.
Para utilizar esta data, debemos instalar el paquete palmerpenguins desde CRAN usando este código: install.packages("palmerpenguins").
En esta base de datos se incluyeron a 3 especies de pingüinos: Adelia, Barbijo y Papúa
Además, hay 8 variables:
- specie: indica la especie de cada pingüino (Adelia, Barbijo y Paúa)
- island: indica la isla donde se observó (en el Archipiélago Palmer o Antártida)
- bill_length_mm: indica la longitud de la cresta dorsal del pico del pingüino (en mm)
- bill_depth_mm: indica la profundidad del pico del pingüino (en mm)
- flipper_length_mm: indica la longitud de la aleta del pingüino (en mm)
- body_mass_g: indica la masa corporal del pingüino (en g)
- sex: indica el sexo del pingüino (macho o hembra)
- year: indica el año del estudio (2007, 2008 o 2009)
Démosle un vistazo a la data:
penguins %>% # Data
head(10) %>% # Mostrar las 10 primeras filas de la data
gt() # Convertir a formato gt| species | island | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | sex | year |
|---|---|---|---|---|---|---|---|
| Adelie | Torgersen | 39.1 | 18.7 | 181 | 3750 | male | 2007 |
| Adelie | Torgersen | 39.5 | 17.4 | 186 | 3800 | female | 2007 |
| Adelie | Torgersen | 40.3 | 18.0 | 195 | 3250 | female | 2007 |
| Adelie | Torgersen | NA | NA | NA | NA | NA | 2007 |
| Adelie | Torgersen | 36.7 | 19.3 | 193 | 3450 | female | 2007 |
| Adelie | Torgersen | 39.3 | 20.6 | 190 | 3650 | male | 2007 |
| Adelie | Torgersen | 38.9 | 17.8 | 181 | 3625 | female | 2007 |
| Adelie | Torgersen | 39.2 | 19.6 | 195 | 4675 | male | 2007 |
| Adelie | Torgersen | 34.1 | 18.1 | 193 | 3475 | NA | 2007 |
| Adelie | Torgersen | 42.0 | 20.2 | 190 | 4250 | NA | 2007 |
5 Ejercicios con Dplyr
Ejercicio 1
Filtrar la data para mostrar únicamente a los pingüinos de la especie “Chinstrap” (Renderizar el chunk de código)
penguins %>%
filter(species == "Chinstrap")# A tibble: 68 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Chinstrap Dream 46.5 17.9 192 3500
2 Chinstrap Dream 50 19.5 196 3900
3 Chinstrap Dream 51.3 19.2 193 3650
4 Chinstrap Dream 45.4 18.7 188 3525
5 Chinstrap Dream 52.7 19.8 197 3725
6 Chinstrap Dream 45.2 17.8 198 3950
7 Chinstrap Dream 46.1 18.2 178 3250
8 Chinstrap Dream 51.3 18.2 197 3750
9 Chinstrap Dream 46 18.9 195 4150
10 Chinstrap Dream 51.3 19.9 198 3700
# ℹ 58 more rows
# ℹ 2 more variables: sex <fct>, year <int>
Ejercicio 2
Filtrar la data para mostrar únicamente a los pingüinos de las especies “Chinstrap” y “Gentoo” (Renderizar el chunk de código)
penguins %>%
filter(species == "Chinstrap" | species == "Gentoo")# A tibble: 192 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Gentoo Biscoe 46.1 13.2 211 4500
2 Gentoo Biscoe 50 16.3 230 5700
3 Gentoo Biscoe 48.7 14.1 210 4450
4 Gentoo Biscoe 50 15.2 218 5700
5 Gentoo Biscoe 47.6 14.5 215 5400
6 Gentoo Biscoe 46.5 13.5 210 4550
7 Gentoo Biscoe 45.4 14.6 211 4800
8 Gentoo Biscoe 46.7 15.3 219 5200
9 Gentoo Biscoe 43.3 13.4 209 4400
10 Gentoo Biscoe 46.8 15.4 215 5150
# ℹ 182 more rows
# ℹ 2 more variables: sex <fct>, year <int>
Ejercicio 3
Filtrar la data para mostrar únicamente a los pingüinos de la especie “Adelie” que sean de la isla “Dream” (Renderizar el chunk de código)
penguins %>%
filter(species == "Adelie", island == "Dream")# A tibble: 56 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Dream 39.5 16.7 178 3250
2 Adelie Dream 37.2 18.1 178 3900
3 Adelie Dream 39.5 17.8 188 3300
4 Adelie Dream 40.9 18.9 184 3900
5 Adelie Dream 36.4 17 195 3325
6 Adelie Dream 39.2 21.1 196 4150
7 Adelie Dream 38.8 20 190 3950
8 Adelie Dream 42.2 18.5 180 3550
9 Adelie Dream 37.6 19.3 181 3300
10 Adelie Dream 39.8 19.1 184 4650
# ℹ 46 more rows
# ℹ 2 more variables: sex <fct>, year <int>
Ejercicio 4
Excluir a todos los pingüinos de la especie “Chinstrap” de la data (Renderizar el chunk de código)
penguins %>%
filter(species != "Chinstrap")# A tibble: 276 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Torgersen 39.1 18.7 181 3750
2 Adelie Torgersen 39.5 17.4 186 3800
3 Adelie Torgersen 40.3 18 195 3250
4 Adelie Torgersen NA NA NA NA
5 Adelie Torgersen 36.7 19.3 193 3450
6 Adelie Torgersen 39.3 20.6 190 3650
7 Adelie Torgersen 38.9 17.8 181 3625
8 Adelie Torgersen 39.2 19.6 195 4675
9 Adelie Torgersen 34.1 18.1 193 3475
10 Adelie Torgersen 42 20.2 190 4250
# ℹ 266 more rows
# ℹ 2 more variables: sex <fct>, year <int>
Ejercicio 5
Filtrar la data para mostrar únicamente a los pingüinos cuya aleta tenga una longitud mayor a 200mm (Renderizar el chunk de código)
penguins %>%
filter(flipper_length_mm > 200)# A tibble: 148 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Dream 35.7 18 202 3550
2 Adelie Dream 41.1 18.1 205 4300
3 Adelie Dream 40.8 18.9 208 4300
4 Adelie Biscoe 41 20 203 4725
5 Adelie Torgersen 41.4 18.5 202 3875
6 Adelie Torgersen 44.1 18 210 4000
7 Adelie Dream 41.5 18.5 201 4000
8 Gentoo Biscoe 46.1 13.2 211 4500
9 Gentoo Biscoe 50 16.3 230 5700
10 Gentoo Biscoe 48.7 14.1 210 4450
# ℹ 138 more rows
# ℹ 2 more variables: sex <fct>, year <int>
Ejercicio 6
Filtrar la data para mostrar únicamente a los pingüinos cuya masa corporal sea, como máximo, 2900g (Renderizar el chunk de código)
penguins %>%
filter(body_mass_g <= 2900)# A tibble: 7 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Biscoe 34.5 18.1 187 2900
2 Adelie Biscoe 36.5 16.6 181 2850
3 Adelie Biscoe 36.4 17.1 184 2850
4 Adelie Dream 33.1 16.1 178 2900
5 Adelie Torgersen 38.6 17 188 2900
6 Chinstrap Dream 43.2 16.6 187 2900
7 Chinstrap Dream 46.9 16.6 192 2700
# ℹ 2 more variables: sex <fct>, year <int>
Ejercicio 7
Seleccione las variables que contengan “length” en el nombre (Renderizar el chunk de código)
penguins %>%
select(contains("length"))# A tibble: 344 × 2
bill_length_mm flipper_length_mm
<dbl> <int>
1 39.1 181
2 39.5 186
3 40.3 195
4 NA NA
5 36.7 193
6 39.3 190
7 38.9 181
8 39.2 195
9 34.1 193
10 42 190
# ℹ 334 more rows
Ejercicio 8
Seleccione las variables que contengan “length” en el nombre o inicien con “bill” (Renderizar el chunk de código)
penguins %>%
select(contains("length") | starts_with("bill"))# A tibble: 344 × 3
bill_length_mm flipper_length_mm bill_depth_mm
<dbl> <int> <dbl>
1 39.1 181 18.7
2 39.5 186 17.4
3 40.3 195 18
4 NA NA NA
5 36.7 193 19.3
6 39.3 190 20.6
7 38.9 181 17.8
8 39.2 195 19.6
9 34.1 193 18.1
10 42 190 20.2
# ℹ 334 more rows
Ejercicio 9
Filtrar la data para mostrar únicamente a los pingüinos de la especie “Adelie” cuya cresta dorsal del pico sea mayor a 40mm (Renderizar el chunk de código)
penguins %>%
filter(species == "Adelie", bill_length_mm > 40)# A tibble: 51 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Torgersen 40.3 18 195 3250
2 Adelie Torgersen 42 20.2 190 4250
3 Adelie Torgersen 41.1 17.6 182 3200
4 Adelie Torgersen 42.5 20.7 197 4500
5 Adelie Torgersen 46 21.5 194 4200
6 Adelie Biscoe 40.6 18.6 183 3550
7 Adelie Biscoe 40.5 17.9 187 3200
8 Adelie Biscoe 40.5 18.9 180 3950
9 Adelie Dream 40.9 18.9 184 3900
10 Adelie Dream 42.2 18.5 180 3550
# ℹ 41 more rows
# ℹ 2 more variables: sex <fct>, year <int>
Ejercicio 10
Seleccione el año, isla y especie de la data (Renderizar el chunk de código)
penguins %>%
select(year, island, species)# A tibble: 344 × 3
year island species
<int> <fct> <fct>
1 2007 Torgersen Adelie
2 2007 Torgersen Adelie
3 2007 Torgersen Adelie
4 2007 Torgersen Adelie
5 2007 Torgersen Adelie
6 2007 Torgersen Adelie
7 2007 Torgersen Adelie
8 2007 Torgersen Adelie
9 2007 Torgersen Adelie
10 2007 Torgersen Adelie
# ℹ 334 more rows
Ejercicio 11
Seleccione las variables desde especies hasta masa corporal usando el operador “:” (Renderizar el chunk de código)
penguins %>%
select(species:body_mass_g)# A tibble: 344 × 6
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Torgersen 39.1 18.7 181 3750
2 Adelie Torgersen 39.5 17.4 186 3800
3 Adelie Torgersen 40.3 18 195 3250
4 Adelie Torgersen NA NA NA NA
5 Adelie Torgersen 36.7 19.3 193 3450
6 Adelie Torgersen 39.3 20.6 190 3650
7 Adelie Torgersen 38.9 17.8 181 3625
8 Adelie Torgersen 39.2 19.6 195 4675
9 Adelie Torgersen 34.1 18.1 193 3475
10 Adelie Torgersen 42 20.2 190 4250
# ℹ 334 more rows
Ejercicio 12
Excluya la variable isla de la data (Renderizar el chunk de código)
penguins %>%
select(-island)# A tibble: 344 × 7
species bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
<fct> <dbl> <dbl> <int> <int> <fct>
1 Adelie 39.1 18.7 181 3750 male
2 Adelie 39.5 17.4 186 3800 female
3 Adelie 40.3 18 195 3250 female
4 Adelie NA NA NA NA <NA>
5 Adelie 36.7 19.3 193 3450 female
6 Adelie 39.3 20.6 190 3650 male
7 Adelie 38.9 17.8 181 3625 female
8 Adelie 39.2 19.6 195 4675 male
9 Adelie 34.1 18.1 193 3475 <NA>
10 Adelie 42 20.2 190 4250 <NA>
# ℹ 334 more rows
# ℹ 1 more variable: year <int>
Ejercicio 13
Seleccione las variables que inicien con “bill” (Renderizar el chunk de código)
penguins %>%
select(starts_with("bill"))# A tibble: 344 × 2
bill_length_mm bill_depth_mm
<dbl> <dbl>
1 39.1 18.7
2 39.5 17.4
3 40.3 18
4 NA NA
5 36.7 19.3
6 39.3 20.6
7 38.9 17.8
8 39.2 19.6
9 34.1 18.1
10 42 20.2
# ℹ 334 more rows
Ejercicio 14
Se desea filtrar a todos pingüinos Gentoo con pico de mas de 15.5 mm de profundidad. Escriba el código para tal tarea. (Renderizar el chunk de código)
penguins %>%
filter(species == "Gentoo", bill_depth_mm > 15.5)# A tibble: 39 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Gentoo Biscoe 50 16.3 230 5700
2 Gentoo Biscoe 49 16.1 216 5550
3 Gentoo Biscoe 49.3 15.7 217 5850
4 Gentoo Biscoe 46.3 15.8 215 5050
5 Gentoo Biscoe 59.6 17 230 6050
6 Gentoo Biscoe 48.4 16.3 220 5400
7 Gentoo Biscoe 44.4 17.3 219 5250
8 Gentoo Biscoe 48.7 15.7 208 5350
9 Gentoo Biscoe 49.6 16 225 5700
10 Gentoo Biscoe 50.5 15.9 222 5550
# ℹ 29 more rows
# ℹ 2 more variables: sex <fct>, year <int>
Ejercicio 15
Filtre a los pinguinos machos que fueron registrados en las islas “Biscoe” y “Dream”. (Renderizar el chunk de código)
penguins %>%
filter(island %in% c("Dream","Biscoe"), sex == "male")# A tibble: 145 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Biscoe 37.7 18.7 180 3600
2 Adelie Biscoe 38.2 18.1 185 3950
3 Adelie Biscoe 38.8 17.2 180 3800
4 Adelie Biscoe 40.6 18.6 183 3550
5 Adelie Biscoe 40.5 18.9 180 3950
6 Adelie Dream 37.2 18.1 178 3900
7 Adelie Dream 40.9 18.9 184 3900
8 Adelie Dream 39.2 21.1 196 4150
9 Adelie Dream 38.8 20 190 3950
10 Adelie Dream 39.8 19.1 184 4650
# ℹ 135 more rows
# ℹ 2 more variables: sex <fct>, year <int>
Ejercicio 16
Filter la data para mostrar a los pinguinos Adelie con una cresta dorsal de pico menor a 35mm que no sean machos. (Renderizar el chunk de código)
penguins %>%
filter(sex == "female", species == "Adelie", bill_length_mm < 35)# A tibble: 7 × 8
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Torgersen 34.4 18.4 184 3325
2 Adelie Biscoe 34.5 18.1 187 2900
3 Adelie Torgersen 33.5 19 190 3600
4 Adelie Torgersen 34.6 17.2 189 3200
5 Adelie Dream 34 17.1 185 3400
6 Adelie Dream 33.1 16.1 178 2900
7 Adelie Dream 32.1 15.5 188 3050
# ℹ 2 more variables: sex <fct>, year <int>
Ejercicio 17
Cree una variable que contenga a la masa corporal pero en kilogramos, llamela “body_mass_kg” y otra variable llamada “flipper_length_m” que contenga a la longitud de la aleta pero en metros (Renderizar el chunk de código)
penguins %>%
mutate(body_mass_kg = body_mass_g / 1000,
flipper_length_m = flipper_length_mm / 1000)# A tibble: 344 × 10
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g
<fct> <fct> <dbl> <dbl> <int> <int>
1 Adelie Torgersen 39.1 18.7 181 3750
2 Adelie Torgersen 39.5 17.4 186 3800
3 Adelie Torgersen 40.3 18 195 3250
4 Adelie Torgersen NA NA NA NA
5 Adelie Torgersen 36.7 19.3 193 3450
6 Adelie Torgersen 39.3 20.6 190 3650
7 Adelie Torgersen 38.9 17.8 181 3625
8 Adelie Torgersen 39.2 19.6 195 4675
9 Adelie Torgersen 34.1 18.1 193 3475
10 Adelie Torgersen 42 20.2 190 4250
# ℹ 334 more rows
# ℹ 4 more variables: sex <fct>, year <int>, body_mass_kg <dbl>,
# flipper_length_m <dbl>
Ejercicio 18
Seleccione a los pinguinos Gentoo y mantenga la isla de la que proviene, el sexo y la masa corporal (Renderizar el chunk de código)
penguins %>%
filter(species == "Gentoo") %>%
select(island, sex, body_mass_g)# A tibble: 124 × 3
island sex body_mass_g
<fct> <fct> <int>
1 Biscoe female 4500
2 Biscoe male 5700
3 Biscoe female 4450
4 Biscoe male 5700
5 Biscoe male 5400
6 Biscoe female 4550
7 Biscoe female 4800
8 Biscoe male 5200
9 Biscoe female 4400
10 Biscoe male 5150
# ℹ 114 more rows
Ejercicio 19
Seleccione a los pinguinos machos con longitud de pico mayor a 200mm y mantenga a las variables que terminen con “mm” (Renderizar el chunk de código)
penguins %>%
filter(sex == "male", flipper_length_mm > 200) %>%
select(ends_with("mm"))# A tibble: 84 × 3
bill_length_mm bill_depth_mm flipper_length_mm
<dbl> <dbl> <int>
1 41.1 18.1 205
2 40.8 18.9 208
3 41 20 203
4 41.4 18.5 202
5 44.1 18 210
6 41.5 18.5 201
7 50 16.3 230
8 50 15.2 218
9 47.6 14.5 215
10 46.7 15.3 219
# ℹ 74 more rows
Ejercicio 20
Cree una tabla con el promedio de la masa corporal de los pinguinos según especie (Renderizar el chunk de código)
penguins %>%
group_by(species) %>%
summarize(mass_promedio = mean(body_mass_g, na.rm = TRUE))# A tibble: 3 × 2
species mass_promedio
<fct> <dbl>
1 Adelie 3701.
2 Chinstrap 3733.
3 Gentoo 5076.
Ejercicio 21
Repita el código de la pregunta 20, pero aplicado solo para los pinguinos machos de la especie Adelie (Renderizar el chunk de código)
penguins %>%
filter(species == "Adelie", sex == "male") %>%
group_by(species) %>%
summarize(mass_promedio = mean(body_mass_g, na.rm = TRUE))# A tibble: 1 × 2
species mass_promedio
<fct> <dbl>
1 Adelie 4043.
Ejercicio de reflexión
Pregunta:
- ¿Crees que importa si primero usamos el select() y luego el filter(), o viceversa?